package com.huirui.server.pojo.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

/**
 * 分类数据传输对象（DTO）
 * <p>用于分类模块的请求参数接收与响应结果返回，统一数据传输格式</p>
 *
 * @author （可补充开发者姓名，可选）
 * @since （可补充版本号，如 1.0.0，可选）
 */
@Data
@Schema(
        description = "分类数据传输对象，用于分类相关的请求和响应数据传递",
        example = "{\"name\":\"电子产品\",\"parentId\":0,\"level\":1,\"sort\":1,\"icon\":\"/icons/electronics.png\",\"status\":1}"
)
public class CategoryDto {
    private Long id;
    /**
     * 分类名称
     * <p>约束：非空、不超过50个字符，需保证同一层级下名称唯一</p>
     */
    @Schema(
            description = "分类名称，同一层级下不可重复",
            requiredMode = Schema.RequiredMode.REQUIRED, // 标记为必填字段
            example = "电子产品",
            maxLength = 50,
            minLength = 1
    )
    private String name;

    /**
     * 父分类ID
     * <p>说明：顶级分类的父ID固定为 0，子分类需关联存在的父分类ID</p>
     */
    @Schema(
            description = "父分类ID，顶级分类填0",
            requiredMode = Schema.RequiredMode.REQUIRED,
            example = "0",
            defaultValue = "0", // 默认值（顶级分类）
            minimum = "0" // 最小取值为0（避免负数ID）
    )
    private Long parentId;

    /**
     * 分类层级
     * <p>规则：顶级分类为1级，子分类层级 = 父分类层级 + 1，最大支持3级分类</p>
     */
    @Schema(
            description = "分类层级（1-顶级，2-二级，3-三级）",
            requiredMode = Schema.RequiredMode.REQUIRED,
            example = "1",
            minimum = "1",
            maximum = "3",
            allowableValues = {"1", "2", "3"} // 明确允许的取值范围
    )
    private Integer level;

    /**
     * 排序序号
     * <p>作用：同一父分类下，按排序序号升序展示（值越小越靠前）</p>
     */
    @Schema(
            description = "同一父分类下的排序序号（值越小越靠前）",
            requiredMode = Schema.RequiredMode.REQUIRED,
            example = "1",
            minimum = "1",
            defaultValue = "10" // 默认排序值（避免默认0导致排序异常）
    )
    private Integer sort;

    /**
     * 分类图标URL
     * <p>格式：支持绝对URL（如 https://xxx.png）或相对URL（如 /icons/xxx.png），为空时使用默认图标</p>
     */
    @Schema(
            description = "分类图标URL（可为空，空则用默认图标）",
            requiredMode = Schema.RequiredMode.NOT_REQUIRED, // 非必填
            example = "/icons/electronics.png",
            maxLength = 255
    )
    private String icon;

    /**
     * 分类状态
     * <p>枚举含义：1-启用（正常展示），0-禁用（不展示但保留数据）</p>
     */
    @Schema(
            description = "分类状态（1-启用，0-禁用）",
            requiredMode = Schema.RequiredMode.REQUIRED,
            example = "1",
            minimum = "0",
            maximum = "1",
            allowableValues = {"0", "1"}, // 明确状态取值
            defaultValue = "1" // 默认启用状态
    )
    private Integer status;

}
